home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / GDebi / GDebiCli.py < prev    next >
Text File  |  2009-09-23  |  6KB  |  154 lines

  1. # Copyright (c) 2005-2009 Canonical Ltd
  2. #
  3. # AUTHOR:
  4. # Michael Vogt <mvo@ubuntu.com>
  5. #
  6. # This file is part of GDebi
  7. #
  8. # GDebi is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License as published
  10. # by the Free Software Foundation; either version 2 of the License, or (at
  11. # your option) any later version.
  12. #
  13. # GDebi is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. # General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with GDebi; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21. #
  22.  
  23.  
  24. import apt
  25. import apt_pkg
  26. import fcntl
  27. import os
  28. import string
  29. import sys
  30. import time
  31. import thread
  32.  
  33. from gettext import gettext as _
  34.  
  35. from DebPackage import DebPackage, Cache
  36. from DscSrcPackage import DscSrcPackage
  37.  
  38. from subprocess import PIPE, Popen, call
  39.  
  40. class GDebiCli(object):
  41.  
  42.     def __init__(self, options):
  43.         # fixme, do graphic cache check
  44.         self.options = options
  45.         if options.quiet:
  46.             tp = apt.progress.OpProgress()
  47.         else:
  48.             tp = apt.progress.OpTextProgress()
  49.         # set architecture to architecture in root-dir
  50.         if options.rootdir and os.path.exists(options.rootdir+"/usr/bin/dpkg"):
  51.             arch = Popen([options.rootdir+"/usr/bin/dpkg",
  52.                           "--print-architecture"], stdout=PIPE).communicate()[0]
  53.             if arch:
  54.                 apt_pkg.Config.Set("APT::Architecture",arch.strip())
  55.         if options.apt_opts:
  56.             for o in options.apt_opts:
  57.                 if o.find('=') < 0:
  58.                     sys.stderr.write(_("Configuration items must be specified with a =<value>\n"))
  59.                     sys.exit(1)
  60.                 (name, value) = o.split('=', 1)
  61.                 try:
  62.                     apt_pkg.Config.Set(name, value)
  63.                 except:
  64.                     sys.stderr.write(_("Couldn't set APT option %s to %s\n") % (name, value))
  65.                     sys.exit(1)
  66.         self._cache = Cache(tp, rootdir=options.rootdir)
  67.  
  68.     def open(self, file):
  69.         try:
  70.             if file.endswith(".deb"):
  71.                 self._deb = DebPackage(self._cache, file)
  72.             elif (file.endswith(".dsc") or
  73.                   os.path.basename(file) == "control"):
  74.                 self._deb = DscSrcPackage(self._cache, file)
  75.             else:
  76.                 sys.stderr.write(_("Unknown package type '%s', exiting\n") % file)
  77.                 sys.exit(1)
  78.         except (IOError,SystemError),e:
  79.             sys.stderr.write(_("Failed to open the software package\n"))
  80.             sys.stderr.write(_("The package might be corrupted or you are not "
  81.                            "allowed to open the file. Check the permissions "
  82.                            "of the file.\n"))
  83.             sys.exit(1)
  84.         # check the deps
  85.         if not self._deb.checkDeb():
  86.             sys.stderr.write(_("This package is uninstallable\n"))
  87.             sys.stderr.write(self._deb._failureString + "\n")
  88.             return False
  89.         return True
  90.             
  91.     def show_description(self):
  92.         try:
  93.             print self._deb["Description"]
  94.         except KeyError:
  95.             print _("No description is available")
  96.  
  97.     def show_dependencies(self):
  98.         # show what changes
  99.         (install, remove, unauthenticated) = self._deb.requiredChanges
  100.         if len(unauthenticated) > 0:
  101.             print _("The following packages are UNAUTHENTICATED: ")
  102.             for pkgname in unauthenticated:
  103.                 print pkgname + " ",
  104.         if len(remove) > 0:
  105.             print _("Requires the REMOVAL of the following packages: ")
  106.             for pkgname in remove:
  107.                 print pkgname + " ",
  108.         print
  109.         if len(install) > 0:
  110.             print _("Requires the installation of the following packages: ") 
  111.             for pkgname in install:
  112.                 print pkgname + " ",
  113.         print
  114.  
  115.     def install(self):
  116.         # install the dependecnies
  117.         (install,remove,unauthenticated) = self._deb.requiredChanges
  118.         if len(install) > 0 or len(remove) > 0:
  119.             fprogress = apt.progress.TextFetchProgress()
  120.             iprogress = apt.progress.InstallProgress()
  121.             try:
  122.                 res = self._cache.commit(fprogress,iprogress)
  123.             except SystemError, e:
  124.                 sys.stderr.write(_("Error during install: '%s'") % e)
  125.                 return False
  126.  
  127.         # install the package itself
  128.         if self._deb.file.endswith(".dsc"): 
  129.             # FIXME: add option to only install build-dependencies
  130.             #        (or build+install the deb) and then enable
  131.             #        this code
  132.             #dir = self._deb.pkgName + "-" + apt_pkg.UpstreamVersion(self._deb["Version"])
  133.             #os.system("dpkg-source -x %s" % self._deb.file)
  134.             #os.system("cd %s && dpkg-buildpackage -b -uc" % dir)
  135.             #for i in self._deb.binaries:
  136.             #    os.system("gdebi %s_%s_*.deb" % (i,self._deb["Version"]))
  137.             pass
  138.         else:
  139.             ret = call(["dpkg","-i",self._deb.file])
  140.             if (ret != 0):
  141.                 return False
  142.         return True
  143.         
  144.  
  145. if __name__ == "__main__":
  146.     app = GDebiCli()
  147.     if not app.open(sys.argv[1]):
  148.         sys.exit(1)
  149.     print _("Do you want to install the software package? [y/N]:"),
  150.     sys.stdout.flush()
  151.     res = sys.stdin.readline()
  152.     if res.startswith("y") or res.startswith("Y"):
  153.         app.install()
  154.